package com.bbc.base.page;

import java.util.ArrayList;

/**
 * 2012-11-23
 * @author hanshaofeng
 *
 * @param <T>
 */
public abstract class AbstractPaginatedList<T> extends ArrayList<T> implements PaginatedList<T> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 默认每页的记录数量
	 */
	public static final int PAGESIZE_DEFAULT = 20;
	/**
	 * 每页大小
	 */
	protected int pageSize;
	/**
	 * 当前页。第一页是1
	 */
	protected int index;

	/**
	 * 总记录数
	 */
	protected int totalItem;
	/**
	 * 总页数
	 */
	protected int totalPage;

	/**
	 * 分页后的记录开始的地方
	 * 第一条记录是1
	 */
	protected int startRow;
	/**
	 * 分页后的记录结束的地方
	 */
	protected int endRow;

	/**
	 * 默认构造方法
	 */
	protected AbstractPaginatedList() {
		repaginate();
	}

	/**
	 * 带当前页和页大小的构造方法
	 * @param index 当前页
	 * @param pageSize 页大小
	 */
	protected AbstractPaginatedList(int index, int pageSize) {
		this.index = index;
		this.pageSize = pageSize;
		repaginate();
	}

	/**
	 * 表示是不是第一页
	 * @return true 是; false 不是
	 */
	public boolean isFirstPage() {
		return index <= 1;
	}

	public boolean isMiddlePage() {
		return !(isFirstPage() || isLastPage());
	}

	public boolean isLastPage() {
		return index >= totalPage;
	}

	public boolean isNextPageAvailable() {
		return !isLastPage();
	}

	public boolean isPreviousPageAvailable() {
		return !isFirstPage();
	}

	/**
	 * 下一页号
	 * @return 取得下一页号
	 */
	public int getNextPage() {
		if (isLastPage()) {
			return totalItem;
		} else {
			return index + 1;
		}
	}

	public int getPreviousPage() {
		if (isFirstPage()) {
			return 1;
		} else {
			return index - 1;
		}
	}

	/**
	 *  每页大小
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 *  每页大小
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
		repaginate();
	}

	/**
	 *  当前页。第一页是1
	 */
	public int getIndex() {
		return index;
	}

	/**
	 *  当前页。第一页是1
	 */
	public void setIndex(int index) {
		this.index = index;
		repaginate();
	}

	/**
	 *  总记录数
	 */
	public int getTotalItem() {
		return totalItem;
	}

	/**
	 *  总记录数
	 */
	public void setTotalItem(int totalItem) {
		this.totalItem = totalItem;
		repaginate();
	}

	/**
	 *  总页数
	 */
	public int getTotalPage() {
		return totalPage;
	}

	/**
	 *  分页后的记录开始的地方
	 */
	public int getStartRow() {
		return startRow;
	}

	/**
	 *  分页后的记录结束的地方
	 */
	public int getEndRow() {
		return endRow;
	}

	/**
	 * Method repaginate ...
	 */
	abstract protected void repaginate();



}
